iT邦幫忙

2024 iThome 鐵人賽

DAY 19
1
AI/ ML & Data

華人市場資料打撈師求生指南系列 第 19

Day 19 - 建立自己的第一個 dbt model

  • 分享至 

  • xImage
  •  

在 dbt 幫我們先建立好的兩個模型中,可以看出來在 dbt 裡面的 SQL Script 以 select 敘述句為主,就跟我們平常使用 LookerStudio,Tableau 或是 Power BI 時,可以先用 Select Query 做一次資料轉換一樣,因此我們會說 dbt 是一個很適合資料分析師上手的工具,但同時這也代表,利用 dbt 完成的資料管線,需要先有人幫我們把資料複製一份到資料倉儲中。簡單說,使用 dbt 前,必須確保資料庫中是有資料的

設定 dbt 在資料庫中的資料源

舉例來說,工程師已經幫我把資料匯入資料倉儲或是資料中台裡面了,如下圖,我的資料倉儲中已經有 crm 系統的公司這張表,以及 訂單系統的庫戶這張表。

https://ithelp.ithome.com.tw/upload/images/20241003/20163103Whl08kQuPu.png

現在我們必須設定 dbt 的 source.yml 檔案,讓 dbt 知道有這些資料源:

  1. 在 model 資料夾下新增一個 source.yml檔
  2. 輸入對應資料源的 database, schema, 以及 table 等等資訊

以 Postgres 來說,所以資料都會統一放在同一個 database 裡面,只是不同系統可能會放進不同的 schema。我的專案是兩個系統的資料都放在名為 postgres 的資料庫中,不同系統的資料分別放在 crm 以及 order_system 這兩張 schema。 name 的部分也是以 schema 為單位命名,因為我原本的 schema name crm 以及 order_system 都很好理解,所以我就維持原狀了。

https://ithelp.ithome.com.tw/upload/images/20241003/20163103gzfQCwDTx9.png

如果覺得打這些格式很麻煩,可以到這個網頁複製貼上已經打好的程式碼,再把值改成自己想要的就可以了。

從資料源 query 建立 dbt model

由於在這個專案的商業模式中,crm.company 以及 order_system.customer 其實是一樣的,只是因為在不同系統,所以被以不同的名詞稱呼,商業團隊也習慣用 company 稱呼自己的客戶,因此我們需要造出一張 dim_company 裡面需要包含 CRM 中跟公司有關的資訊,也需要訂單系統中的 Shipping Plan 資訊。

所以預計的 DAG 圖形大概會長這樣

https://ithelp.ithome.com.tw/upload/images/20241003/20163103nQ1pi1bgwz.png

其中,不論是表格名或者是欄位名,我們都希望把 customer 這個字眼都統一改成 company。所以會先對每一張源資料表建立一個 stg 資料表用來更改表格名,以及固定 data type。

一般的 sql 寫起來應該是

With result as (
    select
    company_id,
    order_system_customer_id as order_system_company_id,
    company_name,
    industry,
    city,
    district,
    created_at,
    updated_at,
    _etl_created_at
from crm.companies
)

select * from result

但在 dbt 中 會寫成

With result as (
    select
    company_id,
    order_system_customer_id as order_system_company_id,
    company_name,
    industry,
    city,
    district,
    created_at,
    updated_at,
    _etl_created_at
from {{ source("crm", "companies") }}
)

select * from result

這時候我們只要要在 model 資料夾新增一個 stg_crm_company 的檔案,並輸入上面的程式碼再存檔就好了。

https://ithelp.ithome.com.tw/upload/images/20241003/201631037OheFyRygy.png

我們也可以用同樣的方法新增一個 stg_order_system_company

從 dbt model query 建立 dbt model

另外,從上面的 DAG 中可以知道, dim_company 需要從 stg_crm_company 以及 stg_order_system_company 這張表中造出來。因為這兩張表都屬於 dbt 專案中下的一個 model 而不是 source,因此原本 {{ source("","") }} 的部分就要改成 {{ref("","") }},程式碼大概會如下:

select
    crm_company.company_id,
    crm_company.order_system_company_id,
    crm_company.industry,
    crm_company.city,
    crm_company.district,
    order_system_company.shipping_plant,
    greatest(crm_company._etl_updated_at, order_system_company._etl_updated_at)
from {{ ref("stg_crm_company") }} as crm_company
left join {{ ref("stg_order_system_company") }} as order_system_company

如此一來 dim_company 這個 model 就算完成了。

之後只要按下 dbt run 整個 project ,就可以在資料庫中看到這些已經寫的 model 變成一張張的 view / table了。


上一篇
Day 18 - dbt run
下一篇
Day 20 - dbt snapshot
系列文
華人市場資料打撈師求生指南30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言